package 力扣_算法题综合.自己不会但觉得高频;

import java.util.ArrayDeque;
import java.util.Deque;

/**
 * @author zx
 * @create 2023-01-08 21:55
 */
public class 用栈实现队列_232 {
    /**
     * 代码开发上的习惯问题：在工业级别代码开发中,最忌讳的就是实现一个类似的函数,直接把代码粘过来改一改就完事了.
     * 这样项目代码会越来越乱,一定要懂得复用;功能相近的函数要抽象出来,不要大量的复制粘贴,很容易出问题！(踩过坑的人自然懂)
     */
    class MyQueue {
        Deque<Integer> inStack;//进栈
        Deque<Integer> outStack;//出栈
        public MyQueue() {
            this.inStack = new ArrayDeque<>();
            this.outStack = new ArrayDeque<>();
        }

        public void push(int x) {
            inStack.push(x);
        }

        public int pop() {
            //只要outStack为空,就将inStack中所有元素push到outStack中
            if(outStack.isEmpty()){
                while(!inStack.isEmpty()){
                    outStack.push(inStack.pop());
                }
            }
            return outStack.pop();
        }

        public int peek() {
            // 直接使用已有的pop函数
            int res = this.pop();
            // 因为pop函数弹出了元素res,所以再添加回去
            outStack.push(res);
            return res;
        }

        /**
         public int peek() {
         if(outStack.isEmpty()){
         while(!inStack.isEmpty()){
         outStack.push(inStack.pop());
         }
         }
         return outStack.peek();
         }
         */

        public boolean empty() {
            return inStack.isEmpty() && outStack.isEmpty();
        }
    }
}
